"""
应用：百度详细翻译
urllib.request.urlopen 和 Request
urllib.parse.quote
urllib.parse.urlencode
quote() 和 urlencode() 的区别
quote() 单纯地将中文进行编译。
urlencode()将字典格式数据编译成url可以识别的类型。如：{’wd‘：’python‘,'word':'123'} --> wd=python&word=123
POST请求，即 urlopen(data=)中，data 不能为空，且 data 的类型为 字节，需要使用 encode() 进行编码
json：
json.loads():将 json 字符串数据类型 转换为 字典数据类型
json.jumps():将 字典类型 转换为 json 字符串数据
"""

from urllib.request import Request, urlopen
from urllib.parse import urlencode
import json

# 百度详细翻译
# 设置 api接口 和 headers
url = 'https://fanyi.baidu.com/v2transapi?from=zh&to=en'

headers = {
	'accept-language': 'zh-CN,zh;q=0.9',
	'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
	'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
	'Cookie': 'BIDUPSID=1B3AE86D1BD840AF1BC36FECE91C076B; PSTM=1610086369; BAIDUID=1B3AE86D1BD840AFD51F2C61C653BC4C:FG=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; __yjs_duid=1_164c67506903ec5c2882a145bbe2b9ed1610087866484; BDUSS=dDNDViNWg5ZFZRM2FkMC1ud3gzQVNHWXBFTGNaU3BZOE13aEUyZmYyUEo3UjlnSVFBQUFBJCQAAAAAAAAAAAEAAAAenUXox7OzqsDr6eTX7cKlwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlg-F~JYPhfRm; BDUSS_BFESS=dDNDViNWg5ZFZRM2FkMC1ud3gzQVNHWXBFTGNaU3BZOE13aEUyZmYyUEo3UjlnSVFBQUFBJCQAAAAAAAAAAAEAAAAenUXox7OzqsDr6eTX7cKlwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlg-F~JYPhfRm; PSINO=3; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[CLK3Lyfkr9D]=mk3SLVN4HKm; BAIDUID_BFESS=FDAC25EBF8F48552E0D465512B0C8A88:FG=1; delPer=1; H_PS_PSSID=33423_33442_31660_33284_33287_33413_26350_33264_33394_33370; BA_HECTOR=0020810k848ha40ggh1fvt7v20r; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1610522614; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1610522981; ab_sr=1.0.0_Y2M2NTBlODYyNzZjOTdjMTdhNzE5MTE0NTU3OWE3YTIxODgzMTQ3NDk1N2ZjMmY0OTQ1MjFmY2YwZTcyZGU0ZDcwYjkzZGZlMDk0OGE3NTk3NTEyODliOGU4MDAxYTYz; __yjsv5_shitong=1.0_7_fa2f8da63aa509e987cd5b3b88d666b9ee2e_300_1610522983773_27.9.202.242_5721dfe4; yjs_js_security_passport=cc15c3ef5d050470f661c81b5e3902f288b4ba3e_1610522985_js',
	# 模拟 Ajax 访问服务器
	'x-requested-with': 'XMLHttpRequest',
	'content-length': '150',
	'origin': 'https://fanyi.baidu.com',
	'Host': 'fanyi.baidu.com'
}


# 定义一个函数封装爬虫程序
def baidu_fanyi(query):
	data = {
		'from': 'zh',
		'to': 'en',
		'query': query,
		'transtype': 'realtime',
		'simple_means_flag': '3',
		'sign': '253813.474180',
		'token': 'da4696bf2d7d364823336a9f8efda571',
		'domain': 'common'
	}

	# post请求时，data 的编码格式需要为 字节，所以需要使用 encode() 进行编码
	# urlencode() 将字典形式解析为 URL 可识别的对象
	# quote 只单纯将中文编码
	req = Request(url, data=urlencode(data).encode('utf-8'), headers=headers)

	# 发送请求
	resp = urlopen(req)

	assert resp.code == 200
	print('请求发送成功！')
	print(url)

	# 读取响应数据
	# 服务器返回的为 json 格式的数据
	json_data = resp.read().decode('utf-8')
	print(type(json_data))

	# 将 json 格式转换为字符串类型
	json_str = json.loads(json_data)

	return json_str


if __name__ == '__main__':
	baidu_fanyi('爬虫')
